Embedded systems are ubiquitous in modern electronic devices. Embedded systems can be found, for example, in a wide range of consumer products—including televisions, cells phones, media players, and automobiles. In fact, it has been estimated that over 98% of the microprocessors that are produced in a year are used in embedded systems.
In many applications, embedded systems are used to control, monitor, or otherwise regulate one or more subsystems of a larger system. Furthermore, embedded systems are often required to provide reliable and timely behavior. To help ensure that an embedded system reliably meets the timing constraints of a larger system, embedded systems often use real-time operating systems (“RTOSes”) that control how tasks are executed by the processor and offer precise timing behavior.
Because embedded systems often interact with a large number of other components and desirably execute real-time software applications, designing embedded systems can be challenging. For example, an embedded software application must not only provide proper functionality, but must also run at a required rate to meet system deadlines and fit into an allotted amount of memory. Furthermore, the embedded system design process often involves numerous development stages, each having a different level of abstraction. For example, an embedded system or an embedded software application may initially be modeled and simulated entirely in a computer environment. All of the surrounding systems may also be modeled and simulated in such an environment. Eventually, as the design process progresses, it may be desirable to debug an embedded software application by running the software on a physical prototype of the embedded system or by running a simulation of the software application while generating and receiving signals to and from the actual hardware components in the overall system. During such simulation and verification, it may be desirable to start, stop, pause, and continue the “real-time” of the software application without disturbing the other operations of the overall system. Such control and flexibility is not possible with conventional development tools. Accordingly, there exists a need for improved methods, systems, and apparatus that provide an embedded system designer greater control, flexibility, and visibility during the development and debugging of real-time embedded software applications.